/**
 * 公共功能模块
 */

//导入debug模块，并定义两个命名空间
const debug = require("debug")("campusItemWarehouse-server:[debug]");
const error = require("debug")("campusItemWarehouse-server:[error]");
//导入加密模块
const crypto = require("crypto");

const config = require("./config");

// 创建 MySQL 连接池
const mysql = require("mysql");
const pool = mysql.createPool(config.dbConfig);

const redis = require('ioredis');

const express = require("express");
const util = require("../common/util");
const UserDB = require("../model/db/user");

/**
 * JSONData数据类型说明
 * @typeof {Object} JSONData
 * @property {Number} code - 返回自定义的状态吗
 * @property {String} msg - 返回自定义的提示信息
 * @property {(object | Array)} data - 返回的数据
 */

/**
 * 统一格式返回JSON数据
 * 
 * 200 - 访问成功
 * 201 - 新增资源
 * 204 - 删除资源
 * 400 - 访问失败
 * 401 - 未授权访问
 * 404 - 资源不存在
 * @param {Number} code - 返回自定义的状态吗
 * @param {String} msg - 返回自定义的提示信息
 * @param {*object | Array} data - 数据结果
 * @returns {JSONData}
 */
function FormatJSONData(code, msg = "", data = []){
    if(!data){
        data = [];
    }
    return {
        code: code,
        msg: msg,
        data: data
    };
}

/**
 * 调试信息
 * @param {String} msg - 调试信息
 */
function log(msg){
    debug(msg);
}

/**
 * 带格式输出的调试信息
 * @param {String} formatter - 格式化字符串 例如 "%s %d", "hello", 42
 * @param {Object} data - 数据对象
 */
function logFormat(formatter, data){
    debug(formatter, data);
}


/**
 * 错误信息
 * @param {String} msg - 错误信息
 */
function err(msg){
    error(msg);
}


/**
 * 生成MD5后的密码
 * @param {String} password 密码
 * @returns {String} 16进制密码串
 */
function md5pwd(password){
    let salt = config.salt;
    let md5 = crypto.createHash("md5");
    return md5.update(password + salt).digest("hex");
}

/**
 * 获取客户端IP
 * @param {Express.Request} req 请求
 * @returns   
 */
function getReqRemoteIP(req){
    return (req.headers["x-forwarded-ip"] || "").split(",")[0] || req.ip;
}

//启动Redis  命令：redis-server   

//创建唯一订单编号
/**
 * @param {String} phone 业务编码
 * @returns {Promise<String>} 生成的订单编号
 */
async function generateUniqueOrderNumber(str) {
    const phone = str.slice(0, 2) + str.slice(-2);//截取号码的前两位和最后两位
    const currentTime = new Date();
    const yyMMdd = currentTime.getFullYear().toString().substring(2) + (currentTime.getMonth() + 1).toString().padStart(2, '0') + currentTime.getDate().toString().padStart(2, '0');
    const currentSecond = currentTime.getSeconds().toString().padStart(2, '0');
    const prefixOrder = phone + yyMMdd + currentSecond;
    const key = prefixOrder;
    const redisClient = new redis(6379, '127.0.0.1'); // 连接到本地Redis服务器

    try {
       const id = await redisClient.incr(key);
       const orderNumber = prefixOrder + id.toString().padStart(4, '0');
       return orderNumber;
    } catch (err) {
        err(err);
        throw err;
    }
}



/**
 *获取SQL执行结果
 */
function query(sql, values){
    return new Promise((resolve, reject)=>{
        pool.getConnection((error, connection)=>{
            if(error){
                reject(error);
            }else{
                //执行sql语句
                connection.query(sql,values,(error,results)=>{
                    //释放连接
                    connection.release();
                    if(error){
                        reject(error);
                    }else{
                        resolve(results);
                    }
                })
            }
        })
    })
}


module.exports = {
    FormatJSONData,
    log,
    logFormat,
    err,
    md5pwd,
    getReqRemoteIP,
    generateUniqueOrderNumber,
    query,
}